

import threading
import time


# 自定义线程类

# class MyThread(threading.Thread):

    # def __init__(self,threadID,name,count):
        # 调用父类的初始化方法构造线程对象
        # threading.Thread.__init__(self)
        # self.threadID = threadID
        # self.name = name
        # self.count = count

    # 多线程要执行的任务 （注意，这里的run 为固定写法）
    # def run(self):
    #     print(f'{self.name}开始执行')
    #     while self.count>0:
    #         print(f'线程{self.name}执行{self.count}')
    #         time.sleep(1)
    #         self.count -= 1
    #     print(f'{self.name}执行结束')


# 创建线程
# mythread1 = MyThread(1,'Thread-1',10)
# mythread2 = MyThread(2,'Thread-2',10)

# 启动多线程
# 注意 不能直接调用run  而是需要执行 start（）
# 开启一个新线程，并在新的线程中执行run方法
# mythread1.start()
# mythread2.start()
#
# # 等待2个线程完成
# mythread1.join()
# mythread2.join()
#
# print('程序结束')

# 练习
# 1. 小明，大明一起吃早饭，小明吃10个包子，大明吃20个包子，吃完后一起出去玩


# class MyThread(threading.Thread):
#
#     def __init__(self,threadID,name,count):
        # 调用父类的初始化方法构造线程对象
        # threading.Thread.__init__(self)
        # self.threadID = threadID
        # self.name = name
        # self.count = count

    # 多线程要执行的任务 （注意，这里的run 为固定写法）
    # def run(self):
    #     print(f'{self.name}开始吃包子')
    #     self.number = 0
    #     while self.count>0:
    #         print(f'{self.name}吃第{self.number+1}个包子')
    #         time.sleep(1)     # 注意 这里需要时间停止，即将cpu的使用权让出
    #         self.count -= 1
    #         self.number += 1
    #     print(f'{self.name}吃完了')


# 创建线程
# xiaoming = MyThread(1,'小明',10)
# daming = MyThread(2,'大明',20)
# 启动线程
# xiaoming.start()
# daming.start()
# 等待大明吃完
# xiaoming.join()
# daming.join()
# print('小明和大明都吃完了，一起出去玩了')


# 练习1
# 定义一个多线程类
# 初始化方法 传入名字，包子数量，吃每个包子的时间
# run方法 打印输出吃第几个包子
# 主线程 创建小明 、大明 两个线程
# 让他们开始吃包子
# 等2个人都吃完，打印输出，一起出去玩

# class MyThread(threading.Thread):
#
#     def __init__(self,name,count,time):
#         # 调用父类的初始化方法构造线程对象
#         threading.Thread.__init__(self)
#         self.name = name
#         self.count = count
#         self.time = time
#
#     def run(self):
#         print(f'{self.name}开始吃包子')
#         self.number = 0
#         while self.count > 0:
#             print(f'{self.name}吃第{self.number + 1}个包子')
#             time.sleep(self.time)
#             self.count -= 1
#             self.number += 1
#         print(f'{self.name}吃完了')
#
# xiaoming = MyThread('小明',10,3)
# daming = MyThread('大明',15,2)
#
# xiaoming.start()
# daming.start()
#
# xiaoming.join()
# daming.join()
# print('大明小明都吃完了，可以一起出去玩了')

# 练习2
# 小明，大明一起吃早饭，一起吃50个包子
# 吃完，一起出去玩
#
# count = 50

# class MyThread(threading.Thread):
#
#     def __init__(self,name):
#         # 调用父类的初始化方法构造线程对象
#         threading.Thread.__init__(self)
#         self.name = name
#
#     def run(self):
#         global count
#         print(f'{self.name}开始吃包子')
#         self.number = 50
#
#         while count > 0:
#             thredLock.acquire()
#             print(f'{self.name}吃第{self.number - count +1}个包子')
#             count -= 1
#             thredLock.release()
#             time.sleep(0.1)
#             # count -= 1
#
#         print('包子吃完了，可以一起出去玩了')


# thredLock = threading.Lock()

# xiaoming = MyThread('小明')
# daming = MyThread('大明')
#
# xiaoming.start()
# daming.start()

# 练习3
# 龟兔赛跑 100米
#乌龟每次 随机往前跑10~20米，随机停下来1-2秒
#兔子每次 随机往前跑20~30米, 随机停下来3-4秒
# 多线程
# 显示每次乌龟跑了多少米
# 最后显示谁赢了
import random
distance = 100


class Runninggame(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name = name

    def run(self):
        global distance
        self.distance = distance
        while True:
            if self.name == '乌龟' :
                thredLock.acquire()
                l1 = random.randint(10,20)
                print(f'{self.name}跑了{l1}米')
                self.distance -= l1
                if self.distance <= 0:
                    print(f'{self.name}赢了')
                    break
                thredLock.release()
                time.sleep(random.randint(1,2))
            else:
                thredLock.acquire()
                l2 = random.randint(20,30)
                print(f'{self.name}跑了{l2}米')
                self.distance -= l2

                if self.distance <= 0:
                    print(f'{self.name}赢了')
                    break
                thredLock.release()
                time.sleep(random.randint(3, 4))


thredLock = threading.Lock()

wugui = Runninggame('乌龟')
tuzi = Runninggame('兔子')

wugui.start()
tuzi.start()




# 练习4
# 一个宿舍住了6个同学
# 每天早上起来需要
# 起床 穿衣服 刷牙 上大号 吃早饭 整理
# 大家都做完了一起上教室上课
# 坑位只有一个，上大号只能1个同学进行，其他事项都可同时进行
# 每件事需要花费5分钟
# 情况1：如果6件事，必须按顺序执行，需要多久
# 情况2: 如果6件事，不是必须按照顺序执行的，总共需要多久。




